Introduction

The Data Set explores AirBnB Prices in Austin.

The Data

sessionInfo(package=NULL)
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] plyr_1.8.4           maps_3.1.1           readr_1.1.0          data.world_0.1.2    
 [5] dplyr_0.5.0          plotly_4.6.0         ggplot2_2.2.1        leaflet_1.1.0       
 [9] DT_0.2               shinydashboard_0.5.3 shiny_1.0.1         

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.10      base64enc_0.1-3   tools_3.3.2       digest_0.6.11    
 [5] evaluate_0.10     jsonlite_1.3      tibble_1.3.0      gtable_0.2.0     
 [9] viridisLite_0.2.0 DBI_0.5-1         crosstalk_1.0.0   curl_2.4         
[13] yaml_2.1.14       knitr_1.15.1      stringr_1.1.0     httr_1.2.1       
[17] htmlwidgets_0.8   hms_0.3           rprojroot_1.2     grid_3.3.2       
[21] R6_2.2.0          rmarkdown_1.3     purrr_0.2.2       tidyr_0.6.1      
[25] magrittr_1.5      backports_1.0.5   scales_0.4.1      htmltools_0.3.5  
[29] rsconnect_0.7     assertthat_0.1    mime_0.5          xtable_1.8-2     
[33] colorspace_1.3-2  httpuv_1.3.3      labeling_0.3      stringi_1.1.2    
[37] lazyeval_0.2.0    munsell_0.4.3    
setwd(dir = "../00 Doc/")
source("../01 Data/ETL_listings.R")
Parsed with column specification:
cols(
  id = col_integer(),
  name = col_character(),
  host_id = col_integer(),
  host_name = col_character(),
  neighbourhood_group = col_character(),
  neighbourhood = col_integer(),
  latitude = col_double(),
  longitude = col_double(),
  room_type = col_character(),
  price = col_integer(),
  minimum_nights = col_integer(),
  number_of_reviews = col_integer(),
  last_review = col_date(format = ""),
  reviews_per_month = col_double(),
  calculated_host_listings_count = col_integer(),
  availability_365 = col_integer()
)
The following `from` values were not present in `x`: table
The following `from` values were not present in `x`: table
invalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generatedinvalid factor level, NA generated
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   5835 obs. of  16 variables:
 $ id                            : Factor w/ 5835 levels "1001400","1002993",..: 3982 2724 5377 5383 4967 4990 3590 4897 5154 2576 ...
 $ name                          : Factor w/ 5780 levels "------Comfy 3/2 Home------",..: 419 2138 4123 4124 1225 4118 4521 2044 4484 4781 ...
 $ host_id                       : Factor w/ 4633 levels "10010707","10015316",..: 2915 2126 3621 3621 2522 3474 2627 169 3538 1232 ...
 $ host_name                     : Factor w/ 1827 levels "(email hidden)",..: 804 1268 1479 1479 224 NA 831 1427 177 NA ...
 $ neighbourhood_group           : Factor w/ 0 levels: NA NA NA NA NA NA NA NA NA NA ...
 $ neighbourhood                 : Factor w/ 41 levels "78701","78702",..: 25 25 25 25 25 25 25 25 25 25 ...
 $ latitude                      : Factor w/ 5835 levels "30.1305163587544",..: 266 225 62 64 65 126 130 109 142 68 ...
 $ longitude                     : Factor w/ 5835 levels "-5.09368239448111",..: 5739 5765 5692 5695 5746 5771 5791 5752 5699 5703 ...
 $ room_type                     : Factor w/ 3 levels "Entire home/apt",..: 2 2 2 2 1 2 2 2 2 2 ...
 $ price                         : Factor w/ 468 levels "0","100","1000",..: 228 464 2 2 362 2 341 283 48 302 ...
 $ minimum_nights                : Factor w/ 26 levels "1","10","13",..: 6 14 1 1 6 1 1 1 1 1 ...
 $ number_of_reviews             : Factor w/ 163 levels "0","1","10","100",..: 2 1 1 1 1 1 1 66 1 67 ...
 $ last_review                   : Factor w/ 330 levels "2011-03-21","2012-01-26",..: 1 NA NA NA NA NA NA 324 NA 305 ...
 $ reviews_per_month             : Factor w/ 566 levels "0.02","0.03",..: 1 NA NA NA NA NA NA 203 NA 252 ...
 $ calculated_host_listings_count: Factor w/ 14 levels "1","10","11",..: 1 1 7 7 7 1 1 1 1 1 ...
 $ availability_365              : Factor w/ 362 levels "0","1","10","100",..: 155 292 293 293 285 293 223 235 282 292 ...
 - attr(*, "spec")=List of 2
  ..$ cols   :List of 16
  .. ..$ id                            : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ name                          : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ host_id                       : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ host_name                     : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ neighbourhood_group           : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ neighbourhood                 : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ latitude                      : list()
  .. .. ..- attr(*, "class")= chr  "collector_double" "collector"
  .. ..$ longitude                     : list()
  .. .. ..- attr(*, "class")= chr  "collector_double" "collector"
  .. ..$ room_type                     : list()
  .. .. ..- attr(*, "class")= chr  "collector_character" "collector"
  .. ..$ price                         : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ minimum_nights                : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ number_of_reviews             : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ last_review                   :List of 1
  .. .. ..$ format: chr ""
  .. .. ..- attr(*, "class")= chr  "collector_date" "collector"
  .. ..$ reviews_per_month             : list()
  .. .. ..- attr(*, "class")= chr  "collector_double" "collector"
  .. ..$ calculated_host_listings_count: list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  .. ..$ availability_365              : list()
  .. .. ..- attr(*, "class")= chr  "collector_integer" "collector"
  ..$ default: list()
  .. ..- attr(*, "class")= chr  "collector_guess" "collector"
  ..- attr(*, "class")= chr "col_spec"
summary(df)
       id                                       name          host_id       host_name   
 1001400:   1   East Austin Bungalow              :   6   4641823 : 127   Erica  : 135  
 1002993:   1   East Austin Home                  :   4   31148752:  42   John   :  56  
 1003316:   1   Euro Hostel/Dorm Style by Downtown:   4   8167447 :  26   Sarah  :  51  
 1003775:   1   Charming East Austin Bungalow     :   3   579290  :  18   Michael:  49  
 1009806:   1   East Austin Charmer               :   3   1488733 :  17   Ryan   :  45  
 1011620:   1   1 bedroom with private bath       :   2   1568741 :  15   (Other):5206  
 (Other):5829   (Other)                           :5813   (Other) :5590   NA's   : 293  
 neighbourhood_group neighbourhood              latitude                longitude   
 NA's:5835           78704  :1601   30.1305163587544:   1   -5.09368239448111:   1  
                     78702  : 797   30.1399214304874:   1   -97.5670481812431:   1  
                     78703  : 419   30.1406878366631:   1   -97.586245659854 :   1  
                     78741  : 414   30.1415093891488:   1   -97.5877635840428:   1  
                     78745  : 328   30.1423321194423:   1   -97.6136226010006:   1  
                     78751  : 251   30.1424347881363:   1   -97.6180279594552:   1  
                     (Other):2025   (Other)         :5829   (Other)          :5829  
           room_type        price      minimum_nights number_of_reviews     last_review  
 Entire home/apt:4060   150    : 253   1      :2776   0      :2006      2015-10-26: 260  
 Private room   :1652   200    : 227   2      :2005   1      : 698      2015-10-12: 215  
 Shared room    : 123   250    : 203   3      : 690   2      : 452      2015-10-25: 187  
                        300    : 181   4      : 147   3      : 302      2015-11-02: 177  
                        100    : 175   5      :  88   4      : 275      2015-10-27: 166  
                        125    : 156   7      :  43   5      : 186      (Other)   :2824  
                        (Other):4640   (Other):  86   (Other):1916      NA's      :2006  
 reviews_per_month calculated_host_listings_count availability_365
 1      : 211      1      :4169                   365    :1236    
 0.13   : 194      2      : 823                   364    : 268    
 0.25   :  79      3      : 232                   363    : 203    
 2      :  77      7      : 169                   0      :  92    
 0.05   :  65      4      : 152                   362    :  80    
 (Other):3201      6      :  62                   361    :  71    
 NA's   :2008      (Other): 228                   (Other):3885    

##        id                                       name          host_id    
##  1001400:   1   East Austin Bungalow              :   6   4641823 : 127  
##  1002993:   1   East Austin Home                  :   4   31148752:  42  
##  1003316:   1   Euro Hostel/Dorm Style by Downtown:   4   8167447 :  26  
##  1003775:   1   Charming East Austin Bungalow     :   3   579290  :  18  
##  1009806:   1   East Austin Charmer               :   3   1488733 :  17  
##  1011620:   1   1 bedroom with private bath       :   2   1568741 :  15  
##  (Other):5829   (Other)                           :5813   (Other) :5590  
##    host_name    neighbourhood_group neighbourhood              latitude   
##  Erica  : 135   NA's:5835           78704  :1601   30.1305163587544:   1  
##  John   :  56                       78702  : 797   30.1399214304874:   1  
##  Sarah  :  51                       78703  : 419   30.1406878366631:   1  
##  Michael:  49                       78741  : 414   30.1415093891488:   1  
##  Ryan   :  45                       78745  : 328   30.1423321194423:   1  
##  (Other):5206                       78751  : 251   30.1424347881363:   1  
##  NA's   : 293                       (Other):2025   (Other)         :5829  
##              longitude              room_type        price     
##  -5.09368239448111:   1   Entire home/apt:4060   150    : 253  
##  -97.5670481812431:   1   Private room   :1652   200    : 227  
##  -97.586245659854 :   1   Shared room    : 123   250    : 203  
##  -97.5877635840428:   1                          300    : 181  
##  -97.6136226010006:   1                          100    : 175  
##  -97.6180279594552:   1                          125    : 156  
##  (Other)          :5829                          (Other):4640  
##  minimum_nights number_of_reviews     last_review   reviews_per_month
##  1      :2776   0      :2006      2015-10-26: 260   1      : 211     
##  2      :2005   1      : 698      2015-10-12: 215   0.13   : 194     
##  3      : 690   2      : 452      2015-10-25: 187   0.25   :  79     
##  4      : 147   3      : 302      2015-11-02: 177   2      :  77     
##  5      :  88   4      : 275      2015-10-27: 166   0.05   :  65     
##  7      :  43   5      : 186      (Other)   :2824   (Other):3201     
##  (Other):  86   (Other):1916      NA's      :2006   NA's   :2008     
##  calculated_host_listings_count availability_365
##  1      :4169                   365    :1236    
##  2      : 823                   364    : 268    
##  3      : 232                   363    : 203    
##  7      : 169                   0      :  92    
##  4      : 152                   362    :  80    
##  6      :  62                   361    :  71    
##  (Other): 228                   (Other):3885

Instruction to Reproduce

  • Download the AirBnb data from data.world, search for “KurtAKranz” and download the dataset named “S17 DV Final Project.”

  • We ran a ETL script that standardized the data from “01 Data” folder. It standardized the colomn data to be consistent among all data points.

  • From that, we used Tableau’s Data connector to connect to our data set in data.world.

  • We created 6 different visualizations using Boxplots, Scatter Plots, Histrograms, Crosstabs, and Barcharts.

  • Our first visualization, we showed a crosstab using zip code and room type, with a key performance idicator of average price. We also created parameters that effectively let one select a price range for acceptable locations.

  • Our second visualization, we showed each zip code’s deviation from the average price among all zip codes. From this, we created a set of the top 5 most pricey zip codes.

  • Our third visualization, we showed the average price of each room type, grouped by zipcode. For each room type, we had a reference line showing the average price of each room type.

  • Our fourth visualization, we created a histogram using the average price to convey that the data is skewed right. This means that using the mean to calculate the average is not going to be as accurate as using the median.

  • Our fifth visualization was Population Vs Average Price where we created a join between the census data and then created a scatter plot with neighbourhood as the coloumns and AVG(Population) and AGG(Average Price) as the rows. We then added a trend line to convey the data’s negetive trend.

  • Our sixth and final visualization, we created a boxplot for the prices of the top 5 most pricey zip codes. This showed the outliars in the data, showing again that the median is the better way to express the average.

  • For our shiny visualizations, we created data frames for each graph we had. We made specifc queries for whatever data we needed. Then we used ggplot to take our data frame and create a ggplot object. From that, we used plotly to express the ggplot data with a more interactive display.

Crosstab with Average Price KPI

  • Crosstab using zip code and room type, with a key performance idicator of average price. Parameters were set at 197 for the low end, and 425 for the high end. Effectively making $197 - $425 someones price range. Values in that range are highlighted green. Values above are red, and values below are blue.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2

Above or Below Average

This shows the releative pricing for each zip code compared to the overall average. This enables comparision for pricing to see if you are paying above the market average.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2

Room Type vs. Price

  • The average price of each room type, grouped by zipcode. For each room type, there is a reference line showing the average price of each room type. This

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2
Above_or_Below Average2
Above_or_Below Average2

Price Histogram

Histogram using the average price to convey that the data is skewed right. This means that using the mean to calculate the average is not going to be as accurate as using the median.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2

Population vs. Average Price

Scatter Plot created using a join between our data and the census data. The trend line’s negative slope indicated that the average price of a zip code decreases as the population of the zip code increases.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2

Top 5 Most Pricey Zip Codes

Boxplot for the prices of the top 5 most pricey zip codes. This showed the outliars in the data, showing again that the median is the better way to express the average.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2
LS0tDQp0aXRsZTogIjxjZW50ZXI+PGI+RmluYWwgUHJvamVjdDwvYj48L2NlbnRlcj4iDQphdXRob3I6ICI8Y2VudGVyPjxiPkRhbmllbCBTdHJvZSwgS3VydCBLcmFueiwgQm9uZ2FuaSBNYmlnaTwvYj48L2NlbnRlcj4iDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KLS0tDQoNCiMqKkludHJvZHVjdGlvbioqDQpUaGUgRGF0YSBTZXQgZXhwbG9yZXMgW0FpckJuQiBQcmljZXMgaW4gQXVzdGluXShodHRwczovL2RhdGEud29ybGQva3VydGFrcmFuei9zLTE3LWR2LXByb2plY3QtNikuIA0KDQojKipUaGUgRGF0YSoqDQoNCmBgYHtyIHNlc3Npb25JbmZvfQ0Kc2Vzc2lvbkluZm8ocGFja2FnZT1OVUxMKQ0KYGBgDQoNCmBgYHtyfQ0Kc2V0d2QoZGlyID0gIi4uLzAwIERvYy8iKQ0Kc291cmNlKCIuLi8wMSBEYXRhL0VUTF9saXN0aW5ncy5SIikNCnN1bW1hcnkoZGYpDQpgYGANCg0KYGBgDQoNCiMjICAgICAgICBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgICAgaG9zdF9pZCAgICANCiMjICAxMDAxNDAwOiAgIDEgICBFYXN0IEF1c3RpbiBCdW5nYWxvdyAgICAgICAgICAgICAgOiAgIDYgICA0NjQxODIzIDogMTI3ICANCiMjICAxMDAyOTkzOiAgIDEgICBFYXN0IEF1c3RpbiBIb21lICAgICAgICAgICAgICAgICAgOiAgIDQgICAzMTE0ODc1MjogIDQyICANCiMjICAxMDAzMzE2OiAgIDEgICBFdXJvIEhvc3RlbC9Eb3JtIFN0eWxlIGJ5IERvd250b3duOiAgIDQgICA4MTY3NDQ3IDogIDI2ICANCiMjICAxMDAzNzc1OiAgIDEgICBDaGFybWluZyBFYXN0IEF1c3RpbiBCdW5nYWxvdyAgICAgOiAgIDMgICA1NzkyOTAgIDogIDE4ICANCiMjICAxMDA5ODA2OiAgIDEgICBFYXN0IEF1c3RpbiBDaGFybWVyICAgICAgICAgICAgICAgOiAgIDMgICAxNDg4NzMzIDogIDE3ICANCiMjICAxMDExNjIwOiAgIDEgICAxIGJlZHJvb20gd2l0aCBwcml2YXRlIGJhdGggICAgICAgOiAgIDIgICAxNTY4NzQxIDogIDE1ICANCiMjICAoT3RoZXIpOjU4MjkgICAoT3RoZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgOjU4MTMgICAoT3RoZXIpIDo1NTkwICANCiMjICAgIGhvc3RfbmFtZSAgICBuZWlnaGJvdXJob29kX2dyb3VwIG5laWdoYm91cmhvb2QgICAgICAgICAgICAgIGxhdGl0dWRlICAgDQojIyAgRXJpY2EgIDogMTM1ICAgTkEnczo1ODM1ICAgICAgICAgICA3ODcwNCAgOjE2MDEgICAzMC4xMzA1MTYzNTg3NTQ0OiAgIDEgIA0KIyMgIEpvaG4gICA6ICA1NiAgICAgICAgICAgICAgICAgICAgICAgNzg3MDIgIDogNzk3ICAgMzAuMTM5OTIxNDMwNDg3NDogICAxICANCiMjICBTYXJhaCAgOiAgNTEgICAgICAgICAgICAgICAgICAgICAgIDc4NzAzICA6IDQxOSAgIDMwLjE0MDY4NzgzNjY2MzE6ICAgMSAgDQojIyAgTWljaGFlbDogIDQ5ICAgICAgICAgICAgICAgICAgICAgICA3ODc0MSAgOiA0MTQgICAzMC4xNDE1MDkzODkxNDg4OiAgIDEgIA0KIyMgIFJ5YW4gICA6ICA0NSAgICAgICAgICAgICAgICAgICAgICAgNzg3NDUgIDogMzI4ICAgMzAuMTQyMzMyMTE5NDQyMzogICAxICANCiMjICAoT3RoZXIpOjUyMDYgICAgICAgICAgICAgICAgICAgICAgIDc4NzUxICA6IDI1MSAgIDMwLjE0MjQzNDc4ODEzNjM6ICAgMSAgDQojIyAgTkEncyAgIDogMjkzICAgICAgICAgICAgICAgICAgICAgICAoT3RoZXIpOjIwMjUgICAoT3RoZXIpICAgICAgICAgOjU4MjkgIA0KIyMgICAgICAgICAgICAgIGxvbmdpdHVkZSAgICAgICAgICAgICAgcm9vbV90eXBlICAgICAgICBwcmljZSAgICAgDQojIyAgLTUuMDkzNjgyMzk0NDgxMTE6ICAgMSAgIEVudGlyZSBob21lL2FwdDo0MDYwICAgMTUwICAgIDogMjUzICANCiMjICAtOTcuNTY3MDQ4MTgxMjQzMTogICAxICAgUHJpdmF0ZSByb29tICAgOjE2NTIgICAyMDAgICAgOiAyMjcgIA0KIyMgIC05Ny41ODYyNDU2NTk4NTQgOiAgIDEgICBTaGFyZWQgcm9vbSAgICA6IDEyMyAgIDI1MCAgICA6IDIwMyAgDQojIyAgLTk3LjU4Nzc2MzU4NDA0Mjg6ICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwICAgIDogMTgxICANCiMjICAtOTcuNjEzNjIyNjAxMDAwNjogICAxICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgICAgOiAxNzUgIA0KIyMgIC05Ny42MTgwMjc5NTk0NTUyOiAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNSAgICA6IDE1NiAgDQojIyAgKE90aGVyKSAgICAgICAgICA6NTgyOSAgICAgICAgICAgICAgICAgICAgICAgICAgKE90aGVyKTo0NjQwICANCiMjICBtaW5pbXVtX25pZ2h0cyBudW1iZXJfb2ZfcmV2aWV3cyAgICAgbGFzdF9yZXZpZXcgICByZXZpZXdzX3Blcl9tb250aA0KIyMgIDEgICAgICA6Mjc3NiAgIDAgICAgICA6MjAwNiAgICAgIDIwMTUtMTAtMjY6IDI2MCAgIDEgICAgICA6IDIxMSAgICAgDQojIyAgMiAgICAgIDoyMDA1ICAgMSAgICAgIDogNjk4ICAgICAgMjAxNS0xMC0xMjogMjE1ICAgMC4xMyAgIDogMTk0ICAgICANCiMjICAzICAgICAgOiA2OTAgICAyICAgICAgOiA0NTIgICAgICAyMDE1LTEwLTI1OiAxODcgICAwLjI1ICAgOiAgNzkgICAgIA0KIyMgIDQgICAgICA6IDE0NyAgIDMgICAgICA6IDMwMiAgICAgIDIwMTUtMTEtMDI6IDE3NyAgIDIgICAgICA6ICA3NyAgICAgDQojIyAgNSAgICAgIDogIDg4ICAgNCAgICAgIDogMjc1ICAgICAgMjAxNS0xMC0yNzogMTY2ICAgMC4wNSAgIDogIDY1ICAgICANCiMjICA3ICAgICAgOiAgNDMgICA1ICAgICAgOiAxODYgICAgICAoT3RoZXIpICAgOjI4MjQgICAoT3RoZXIpOjMyMDEgICAgIA0KIyMgIChPdGhlcik6ICA4NiAgIChPdGhlcik6MTkxNiAgICAgIE5BJ3MgICAgICA6MjAwNiAgIE5BJ3MgICA6MjAwOCAgICAgDQojIyAgY2FsY3VsYXRlZF9ob3N0X2xpc3RpbmdzX2NvdW50IGF2YWlsYWJpbGl0eV8zNjUNCiMjICAxICAgICAgOjQxNjkgICAgICAgICAgICAgICAgICAgMzY1ICAgIDoxMjM2ICAgIA0KIyMgIDIgICAgICA6IDgyMyAgICAgICAgICAgICAgICAgICAzNjQgICAgOiAyNjggICAgDQojIyAgMyAgICAgIDogMjMyICAgICAgICAgICAgICAgICAgIDM2MyAgICA6IDIwMyAgICANCiMjICA3ICAgICAgOiAxNjkgICAgICAgICAgICAgICAgICAgMCAgICAgIDogIDkyICAgIA0KIyMgIDQgICAgICA6IDE1MiAgICAgICAgICAgICAgICAgICAzNjIgICAgOiAgODAgICAgDQojIyAgNiAgICAgIDogIDYyICAgICAgICAgICAgICAgICAgIDM2MSAgICA6ICA3MSAgICANCiMjICAoT3RoZXIpOiAyMjggICAgICAgICAgICAgICAgICAgKE90aGVyKTozODg1DQoNCmBgYA0KDQoNCg0KSW5zdHJ1Y3Rpb24gdG8gUmVwcm9kdWNlDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIERvd25sb2FkIHRoZSBBaXJCbmIgZGF0YSBmcm9tIGRhdGEud29ybGQsIHNlYXJjaCBmb3IgIkt1cnRBS3JhbnoiIGFuZCBkb3dubG9hZCB0aGUgZGF0YXNldCBuYW1lZCAiUzE3IERWIEZpbmFsIFByb2plY3QuIg0KDQotIFdlIHJhbiBhIEVUTCBzY3JpcHQgdGhhdCBzdGFuZGFyZGl6ZWQgdGhlIGRhdGEgZnJvbSAiMDEgRGF0YSIgZm9sZGVyLiBJdCBzdGFuZGFyZGl6ZWQgdGhlIGNvbG9tbiBkYXRhIHRvIGJlIGNvbnNpc3RlbnQgYW1vbmcgYWxsIGRhdGEgcG9pbnRzLg0KDQotIEZyb20gdGhhdCwgd2UgdXNlZCBUYWJsZWF1J3MgRGF0YSBjb25uZWN0b3IgdG8gY29ubmVjdCB0byBvdXIgZGF0YSBzZXQgaW4gZGF0YS53b3JsZC4NCg0KLSBXZSBjcmVhdGVkIDYgZGlmZmVyZW50IHZpc3VhbGl6YXRpb25zIHVzaW5nIEJveHBsb3RzLCBTY2F0dGVyIFBsb3RzLCBIaXN0cm9ncmFtcywgQ3Jvc3N0YWJzLCBhbmQgQmFyY2hhcnRzLg0KDQotIE91ciBmaXJzdCB2aXN1YWxpemF0aW9uLCB3ZSBzaG93ZWQgYSBjcm9zc3RhYiB1c2luZyB6aXAgY29kZSBhbmQgcm9vbSB0eXBlLCB3aXRoIGEga2V5IHBlcmZvcm1hbmNlIGlkaWNhdG9yIG9mIGF2ZXJhZ2UgcHJpY2UuIFdlIGFsc28gY3JlYXRlZCBwYXJhbWV0ZXJzIHRoYXQgZWZmZWN0aXZlbHkgbGV0IG9uZSBzZWxlY3QgYSBwcmljZSByYW5nZSBmb3IgYWNjZXB0YWJsZSBsb2NhdGlvbnMuDQoNCi0gT3VyIHNlY29uZCB2aXN1YWxpemF0aW9uLCB3ZSBzaG93ZWQgZWFjaCB6aXAgY29kZSdzIGRldmlhdGlvbiBmcm9tIHRoZSBhdmVyYWdlIHByaWNlIGFtb25nIGFsbCB6aXAgY29kZXMuIEZyb20gdGhpcywgd2UgY3JlYXRlZCBhIHNldCBvZiB0aGUgdG9wIDUgbW9zdCBwcmljZXkgemlwIGNvZGVzLg0KDQotIE91ciB0aGlyZCB2aXN1YWxpemF0aW9uLCB3ZSBzaG93ZWQgdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgZWFjaCByb29tIHR5cGUsIGdyb3VwZWQgYnkgemlwY29kZS4gRm9yIGVhY2ggcm9vbSB0eXBlLCB3ZSBoYWQgYSByZWZlcmVuY2UgbGluZSBzaG93aW5nIHRoZSBhdmVyYWdlIHByaWNlIG9mIGVhY2ggcm9vbSB0eXBlLg0KDQotIE91ciBmb3VydGggdmlzdWFsaXphdGlvbiwgd2UgY3JlYXRlZCBhIGhpc3RvZ3JhbSB1c2luZyB0aGUgYXZlcmFnZSBwcmljZSB0byBjb252ZXkgdGhhdCB0aGUgZGF0YSBpcyBza2V3ZWQgcmlnaHQuIFRoaXMgbWVhbnMgdGhhdCB1c2luZyB0aGUgbWVhbiB0byBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgaXMgbm90IGdvaW5nIHRvIGJlIGFzIGFjY3VyYXRlIGFzIHVzaW5nIHRoZSBtZWRpYW4uDQoNCi0gT3VyIGZpZnRoIHZpc3VhbGl6YXRpb24gd2FzIFBvcHVsYXRpb24gVnMgQXZlcmFnZSBQcmljZSB3aGVyZSB3ZSBjcmVhdGVkIGEgam9pbiBiZXR3ZWVuIHRoZSBjZW5zdXMgZGF0YSBhbmQgdGhlbiBjcmVhdGVkIGEgc2NhdHRlciBwbG90IHdpdGggbmVpZ2hib3VyaG9vZCBhcyB0aGUgY29sb3VtbnMgYW5kIEFWRyhQb3B1bGF0aW9uKSBhbmQgQUdHKEF2ZXJhZ2UgUHJpY2UpIGFzIHRoZSByb3dzLiBXZSB0aGVuIGFkZGVkIGEgdHJlbmQgbGluZSB0byBjb252ZXkgdGhlIGRhdGEncyBuZWdldGl2ZSB0cmVuZC4NCg0KLSBPdXIgc2l4dGggYW5kIGZpbmFsIHZpc3VhbGl6YXRpb24sIHdlIGNyZWF0ZWQgYSBib3hwbG90IGZvciB0aGUgcHJpY2VzIG9mIHRoZSB0b3AgNSBtb3N0IHByaWNleSB6aXAgY29kZXMuIFRoaXMgc2hvd2VkIHRoZSBvdXRsaWFycyBpbiB0aGUgZGF0YSwgc2hvd2luZyBhZ2FpbiB0aGF0IHRoZSBtZWRpYW4gaXMgdGhlIGJldHRlciB3YXkgdG8gZXhwcmVzcyB0aGUgYXZlcmFnZS4NCg0KLSBGb3Igb3VyIHNoaW55IHZpc3VhbGl6YXRpb25zLCB3ZSBjcmVhdGVkIGRhdGEgZnJhbWVzIGZvciBlYWNoIGdyYXBoIHdlIGhhZC4gV2UgbWFkZSBzcGVjaWZjIHF1ZXJpZXMgZm9yIHdoYXRldmVyIGRhdGEgd2UgbmVlZGVkLiBUaGVuIHdlIHVzZWQgZ2dwbG90IHRvIHRha2Ugb3VyIGRhdGEgZnJhbWUgYW5kIGNyZWF0ZSBhIGdncGxvdCBvYmplY3QuIEZyb20gdGhhdCwgd2UgdXNlZCBwbG90bHkgdG8gZXhwcmVzcyB0aGUgZ2dwbG90IGRhdGEgd2l0aCBhIG1vcmUgaW50ZXJhY3RpdmUgZGlzcGxheS4gIA0KDQoNCg0KIyNbU2hpbnkgQXBwXShodHRwczovL2t1cnRha3Jhbnouc2hpbnlhcHBzLmlvL2JhcmNoYXJ0c19wcm9qZWN0Ni8pIA0KDQoNCkNyb3NzdGFiIHdpdGggQXZlcmFnZSBQcmljZSBLUEkNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIENyb3NzdGFiIHVzaW5nIHppcCBjb2RlIGFuZCByb29tIHR5cGUsIHdpdGggYSBrZXkgcGVyZm9ybWFuY2UgaWRpY2F0b3Igb2YgYXZlcmFnZSBwcmljZS4gUGFyYW1ldGVycyB3ZXJlIHNldCBhdCAxOTcgZm9yIHRoZSBsb3cgZW5kLCBhbmQgNDI1IGZvciB0aGUgaGlnaCBlbmQuIEVmZmVjdGl2ZWx5IG1ha2luZyAkMTk3IC0gJDQyNSBzb21lb25lcyBwcmljZSByYW5nZS4gVmFsdWVzIGluIHRoYXQgcmFuZ2UgYXJlIGhpZ2hsaWdodGVkIGdyZWVuLiBWYWx1ZXMgYWJvdmUgYXJlIHJlZCwgYW5kIHZhbHVlcyBiZWxvdyBhcmUgYmx1ZS4NCg0KIyMjVGFibGVhdQ0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2VdKC4uLzAzIFZpc3VhbGl6YXRpb25zL2Nyb3NzdGFiLnBuZyk8L2NlbnRlcj4NCiMjI1NoaW55DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZTJdKC4uLzAzIFZpc3VhbGl6YXRpb25zL2Nyb3NzdGFiX3NoaW55LnBuZyk8L2NlbnRlcj4NCg0KDQpBYm92ZSBvciBCZWxvdyBBdmVyYWdlDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KVGhpcyBzaG93cyB0aGUgcmVsZWF0aXZlIHByaWNpbmcgZm9yIGVhY2ggemlwIGNvZGUgY29tcGFyZWQgdG8gdGhlIG92ZXJhbGwgYXZlcmFnZS4gVGhpcyBlbmFibGVzIGNvbXBhcmlzaW9uIGZvciBwcmljaW5nIHRvIHNlZSBpZiB5b3UgYXJlIHBheWluZyBhYm92ZSB0aGUgbWFya2V0IGF2ZXJhZ2UuDQoNCg0KIyMjVGFibGVhdQ0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2VdKC4uLzAzIFZpc3VhbGl6YXRpb25zL2Fib3ZlX29yX2JlbG93X2F2ZXJhZ2UucG5nKTwvY2VudGVyPg0KIyMjU2hpbnkNCjxjZW50ZXI+IVtBYm92ZV9vcl9CZWxvdyBBdmVyYWdlMl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvYWJvdmVfb3JfYmVsb3dfYXZlcmFnZV9zaGlueS5wbmcpPC9jZW50ZXI+DQoNCg0KDQoNClJvb20gVHlwZSB2cy4gUHJpY2UNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotIFRoZSBhdmVyYWdlIHByaWNlIG9mIGVhY2ggcm9vbSB0eXBlLCBncm91cGVkIGJ5IHppcGNvZGUuIEZvciBlYWNoIHJvb20gdHlwZSwgdGhlcmUgaXMgYSByZWZlcmVuY2UgbGluZSBzaG93aW5nIHRoZSBhdmVyYWdlIHByaWNlIG9mIGVhY2ggcm9vbSB0eXBlLiBUaGlzIA0KDQojIyNUYWJsZWF1DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvcm9vbV90eXBlX3ByaWNlLnBuZyk8L2NlbnRlcj4NCiMjI1NoaW55DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZTJdKC4uLzAzIFZpc3VhbGl6YXRpb25zL3Jvb21fdHlwZV9wcmljZV9zaGlueTEucG5nKTwvY2VudGVyPg0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2UyXSguLi8wMyBWaXN1YWxpemF0aW9ucy9yb29tX3R5cGVfcHJpY2Vfc2hpbnkyLnBuZyk8L2NlbnRlcj4NCjxjZW50ZXI+IVtBYm92ZV9vcl9CZWxvdyBBdmVyYWdlMl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvcm9vbV90eXBlX3ByaWNlX3NoaW55My5wbmcpPC9jZW50ZXI+DQoNCg0KDQpQcmljZSBIaXN0b2dyYW0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpIaXN0b2dyYW0gdXNpbmcgdGhlIGF2ZXJhZ2UgcHJpY2UgdG8gY29udmV5IHRoYXQgdGhlIGRhdGEgaXMgc2tld2VkIHJpZ2h0LiBUaGlzIG1lYW5zIHRoYXQgdXNpbmcgdGhlIG1lYW4gdG8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIGlzIG5vdCBnb2luZyB0byBiZSBhcyBhY2N1cmF0ZSBhcyB1c2luZyB0aGUgbWVkaWFuLg0KDQoNCiMjI1RhYmxlYXUNCjxjZW50ZXI+IVtBYm92ZV9vcl9CZWxvdyBBdmVyYWdlXSguLi8wMyBWaXN1YWxpemF0aW9ucy9wcmljZV9oaXN0b2dyYW0ucG5nKTwvY2VudGVyPg0KIyMjU2hpbnkNCjxjZW50ZXI+IVtBYm92ZV9vcl9CZWxvdyBBdmVyYWdlMl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvcHJpY2VfaGlzdG9ncmFtX3NoaW55LnBuZyk8L2NlbnRlcj4NCg0KDQoNClBvcHVsYXRpb24gdnMuIEF2ZXJhZ2UgUHJpY2UNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpTY2F0dGVyIFBsb3QgY3JlYXRlZCB1c2luZyBhIGpvaW4gYmV0d2VlbiBvdXIgZGF0YSBhbmQgdGhlIGNlbnN1cyBkYXRhLiBUaGUgdHJlbmQgbGluZSdzIG5lZ2F0aXZlIHNsb3BlIGluZGljYXRlZCB0aGF0IHRoZSBhdmVyYWdlIHByaWNlIG9mIGEgemlwIGNvZGUgZGVjcmVhc2VzIGFzIHRoZSBwb3B1bGF0aW9uIG9mIHRoZSB6aXAgY29kZSBpbmNyZWFzZXMuDQoNCg0KIyMjVGFibGVhdQ0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2VdKC4uLzAzIFZpc3VhbGl6YXRpb25zL3NjYXR0ZXJfcGxvdC5wbmcpPC9jZW50ZXI+DQojIyNTaGlueQ0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2UyXSguLi8wMyBWaXN1YWxpemF0aW9ucy9zY2F0dGVyX3Bsb3Rfc2hpbnkucG5nKTwvY2VudGVyPg0KDQoNCg0KVG9wIDUgTW9zdCBQcmljZXkgWmlwIENvZGVzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KQm94cGxvdCBmb3IgdGhlIHByaWNlcyBvZiB0aGUgdG9wIDUgbW9zdCBwcmljZXkgemlwIGNvZGVzLiBUaGlzIHNob3dlZCB0aGUgb3V0bGlhcnMgaW4gdGhlIGRhdGEsIHNob3dpbmcgYWdhaW4gdGhhdCB0aGUgbWVkaWFuIGlzIHRoZSBiZXR0ZXIgd2F5IHRvIGV4cHJlc3MgdGhlIGF2ZXJhZ2UuDQoNCg0KIyMjVGFibGVhdQ0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2VdKC4uLzAzIFZpc3VhbGl6YXRpb25zL2JveF9wbG90LnBuZyk8L2NlbnRlcj4NCiMjI1NoaW55DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZTJdKC4uLzAzIFZpc3VhbGl6YXRpb25zL2JveF9wbG90X3NoaW55LnBuZyk8L2NlbnRlcj4NCg==